package com.common.exception;

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Getter;
import lombok.SneakyThrows;

import java.util.HashMap;
import java.util.Map;

@Getter
public enum ErrCode implements ErrAssert {
    Request_Param("请求参数错误", 400),
    Verify_Code("账户或密码不正确", 401),
    Token_Invalid("令牌非法", 403),
    Not_Found("资源不存在", 404),
    System_Error("系统出错", 500),
    Not_Supported("暂不支持", 501),

    Operation_Denial("操作被拒", 403);

    private String msg;
    private final int code;

    ErrCode(String _msg, int _code) {
        this.msg = _msg;
        this.code = _code;
    }

    public static void set(ErrCode e, String msg) {
        e.msg = msg;
    }

    public static String get(ErrCode e) {
        String msg = e.getMsg();
        String name = e.name();
        return get(name, msg);
    }

    @SneakyThrows
    private static String get(String name, String msg) {
        ObjectMapper mapper = new ObjectMapper();
        Map<String, String> map = new HashMap<>() {{
            put("msg", msg);
            put("code", name);
        }};
        return mapper.writeValueAsString(map);
    }

    public static String get(ErrCode e, String msg) {
        String name = e.name();
        String msg2 = (msg == null || msg.isEmpty()) ? e.getMsg() : msg;
        return get(name, msg2);
    }

    @Override
    public SeException se(String msg) {
        return new SeException(this, msg);
    }

    @Override
    public SeException se() {
        return new SeException(this);
    }
}
